package com.example.shipback.client;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 监听哪些客户端来连接了WebSocket服务端
 *
 * @author Emil
 */
@ServerEndpoint("/ws")
@Component
@Slf4j
public class WebServerEndpoint {

    // 因为可能有多个客户端所以这里需要保证线程安全
    static Map<String, Session> sessionMap = new ConcurrentHashMap<>();

    // 建立连接时执行的操作
    @OnOpen
    public void onOpen(Session session) {   // 每个websocket连接对于服务端来说都是一个Session
        sessionMap.put(session.getId(), session);
        log.info("websocket is open");
    }

    /**
     * 收到客户端消息时执行的操作
     *
     * @param text 接受到客户端的消息
     * @return 返回给客户端的消息
     * <p>
     * for(String key: sessionMap.keySet()){ // 给所有客户端发送消息
     * sessionMap.get(key).getBasicRemote().sendText("beat");
     * }
     */
    @OnMessage
    public String onMessage(String text) throws IOException {
        for (String key : sessionMap.keySet()) { // 给所有客户端发送消息
            sessionMap.get(key).getBasicRemote().sendText(text);
        }
        log.info("收到一条新消息: " + text);
        return "收到 !";
    }

    // 连接关闭时执行的操作
    @OnClose
    public void onClose(Session session) {
        sessionMap.remove(session.getId());
        log.info("websocket is close");
    }
}
